package Queue;

public class SqQueue implements IQueue {
    // 顺序队列的实现

    // 队列的存储空间
    private Object[] queueElem;
    // 指向队尾元素的下一个存储单元格 用于插入
    private int rear;
    // 指向队首元素 用于抛出对应元素
    private int front;
    // 队列的最大存储单元个数
    private int maxSize;

    // 构造最大为maxsize的空队列
    public SqQueue(int maxSize){
        // 声明队首与队尾 的指针都是0
        front = rear = 0;
        // 声明最大长度为maxsize 的队列
        queueElem = new Object[maxSize];
        this.maxSize = maxSize;
    }

    // 将队列置空
    public void clear() {
        // 队尾进 将队尾置为0 代表这个队列需要重新开始传入数据
        rear = 0;
        front = 0;
    }

    // 是否为空
    public boolean isEmpty() {
        // 其中 队尾与队首的指针会进行移动，所以不能简单的使用 rear==0 来进行判断
        return rear==front;
    }

    // 长度
    public int length() {
        return rear-front;
    }

    // 读取队首元素并且返回其值
    public Object peek() {
        if(isEmpty()){
            return null;
        }else {
            return queueElem[front];
        }
    }

    // 入队列
    public void offer(Object x) throws Exception {
        if(rear == maxSize){
            throw new Exception("队列已经存满");
        }else{
            queueElem[rear]= x;
            rear++;
        }
    }

    // 出队列
    public Object poll() {
        if(isEmpty()){
            return null;
        }else {
            // 先自增  但是会返回自增前的值
            int tmp = front++;
            return queueElem[tmp];
        }
    }

    // 输出队列中的所有数据元素
    public void display() {
        if(!isEmpty()){
            for(int i=front; i<rear; i++){
                System.out.println(queueElem[i]);
            }
        }else {
            System.out.println("此队列为空");
        }
    }
}

